package main

/**
 * @Author: DengLibin
 * @Date: Create in 2023-01-17 10:40:54
 * @Description: 383. 赎金信
 给你两个字符串：ransomNote 和 magazine ，判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以，返回 true ；否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。
示例 1：

输入：ransomNote = "a", magazine = "b"
输出：false
示例 2：

输入：ransomNote = "aa", magazine = "ab"
输出：false
示例 3：

输入：ransomNote = "aa", magazine = "aab"
输出：true
*/
/**
 * @Author: DengLibin
 * @Date: Create in 2023-01-17 10:41:21
 * @Description: 使用map[字符]次数
 */
func canConstruct(ransomNote string, magazine string) bool {
	m := make(map[rune]uint32, len(magazine))
	for _, c := range magazine {
		num, has := m[c]
		if has {
			m[c] = num + 1
		} else {
			m[c] = 1
		}
	}
	for _, c := range ransomNote {
		i, has := m[c]
		if !has || i == 0 {
			return false
		}
		m[c] = i - 1
	}
	return true
}
